/**
 * 定义主题（可观察对象）类
 */
class Subject {
  /**
   * 无参构造器
   */
  constructor() {
    // 存储观察者的数组
    this.observers = [];
  }

  /**
   * 添加观察者
   * @param observer
   */
  addObserver(observer) {
    this.observers.push(observer);
  }

  /**
   * 删除观察者
   * @param observer
   */
  removeObserver(observer) {
    const index = this.observers.indexOf(observer);
    if (index!== -1) {
      this.observers.splice(index, 1);
    }
  }

  /**
   * 通知观察者状态更新
   * 这里只针对消息这块进行了通知，可以扩展别的
   * @param bizType
   * @param msgContent
   */
  notifyObservers(bizType,msgContent) {
    this.observers.forEach(observer => {
      try {
        this.sendMsg(observer,bizType,msgContent)
      }catch (e) {
        console.error("消息消费失败-------------> 业务KEY:"+bizType+"______________________," + JSON.stringify(e.stack));
      }
    });
  }

  async sendMsg(observer,bizType,msgContent){
     return new Promise((resolve, reject) => {
      observer.update(bizType,msgContent);
    } )
  }
}

export {Subject}
